//
//  SHKRealmManager.h
//  EagleCloud
//
//  Created by Cer on 2019/8/5.
//
// 类的创建者: 宋鸿康
// 类的描述说明: reaml 管理类

#import <Foundation/Foundation.h>
#import "YsCloudFileRealmBaseModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface YsCloudFileRealmManager : NSObject

/**
 数据库初始化配置

 @param DirName document文件夹下的目录名字
 @param realmName realm的名字
 */
+ (void)setupConfigWithDirName:(NSString *)DirName
                 withRealmName:(NSString *)realmName;


/**
 得到realm对象

 @param path realm的路径
 @return realm对象
 */
+ (RLMRealm *)getRealmWithPath:(NSString *)path;


/**
 写入一条数据

 @param obj 写入的对象
 @return 执行结果
 */
+ (BOOL)writeObj:(YsCloudFileRealmBaseModel *)obj;

/**
 写入多条数据
 
 @param objs 写入的对象 不更新
 @return 执行结果
 */
+ (BOOL)ys_writeObj:(YsCloudFileRealmBaseModel *)obj;

/**
 写入多条数据

 @param objs 写入的对象
 @return 执行结果
 */
+ (BOOL)writeObjs:(NSArray<YsCloudFileRealmBaseModel *> *)objs;



/**
 写入多条数据

 @param objs 写入的对象 不更新
 @return 执行结果
 */
+ (BOOL)ys_writeObjs:(NSArray<YsCloudFileRealmBaseModel *> *)objs;

/**
 查询目标数据模型的所有存储数据

 @param clazz clazz 需要查询的目标类
 @return 数据库中存储的所有数据
 */
+ (NSArray< YsCloudFileRealmBaseModel *> *)queryAllObj:(Class)clazz;


/**
 查询目标数据模型的所有存储数据

 @param predicate 查询条件
 @param keyPath 查询的属性
 @param ascending 排序
 @param clazz 需要查询的类
 @return 数据库中存储的所有数据
 */
+ (NSArray<YsCloudFileRealmBaseModel *> *)queryObjsWithPredicate:(NSPredicate *)predicate
                                              keyPath:(NSString *)keyPath
                                            ascending:(BOOL)ascending
                                          targetClass:(Class)clazz;


/**
 查询目标数据模型的所有存储数据

 @param predicate 查询条件
 @param clazz 需要查询的类
 @return 数据库中存储的所有数据
 */
+ (NSArray<YsCloudFileRealmBaseModel *> *)queryObjsWithPredicate:(NSPredicate *)predicate
                                          targetClass:(Class)clazz;
/**
 *  根据主键查询目标数据
 *
 *  @param primaryKey 主键值
 *  @param clazz      需要查询的类
 *
 *  @return 查询结果
 */
+ (YsCloudFileRealmBaseModel *)queryObjWithPrimaryKey:(id)primaryKey targetClass:(Class)clazz;
/**
 在数据库中删除目标数据

 @param obj 目标数据
 @return 执行结果
 */
+ (BOOL)deleteObj:(YsCloudFileRealmBaseModel *)obj;

/**
 *  在数据库中删除目标数组数据
 *
 *  @param objs 需要删除的数据数组
 *
 *  @return 执行结果
 */
+ (BOOL)deleteObjs:(NSArray<YsCloudFileRealmBaseModel *> *)objs;

/**
 *  在数据库中目标主键数据
 *
 * @param primaryKey 主键
 * @param clazz 目标类
 *
 * @return 执行结果
 */
+ (BOOL)deleteObjWithPrimaryKey:(id)primaryKey targetClass:(Class)clazz;

/**
 * 在数据库中删除所有目标类对应的数据
 *
 * @param clazz 目标类
 *
 * @return 执行结果
 */
+ (BOOL)deleteAllTargetObjs:(Class)clazz;

/**
 *  更新一条数据，更新数据必须在block中执行
 *
 *  @param updateBlock 在block中更新数据
 *
 *  @return 执行结果
 */
+ (BOOL)updateObj:(void (^)(void))updateBlock;

/**
 把RMLArray数组转换成NSArray

 @param RLMArray realm数组
 @return NSArray
 */
+ (NSArray<YsCloudFileRealmBaseModel *> *)convertWithRLMArray:(RLMArray<YsCloudFileRealmBaseModel *> *)RLMArray;
/**
 *  清空数据库
 *
 *  @return 执行结果
 */
+ (BOOL)clear;


+ (void)refresh;
@end

NS_ASSUME_NONNULL_END
